'''
Created on 13/05/2013

@author: cristian
'''
from pm import app
from pm.database import db
from pm.models.Relaciones import Relaciones
from pm.models.Items import Items
from sqlalchemy.orm.exc import NoResultFound


def existeRelacion(id_origen, id_destino):
    """
    Metodo que controla que la relacion padre hijo no se encuentre
    @param id_origen: identificador del origen de la relacion
    @param id_destino: identificador del destino de la relacion 
    """
    try:
        return Relaciones.query.filter(Relaciones.id_origen == id_origen).filter(Relaciones.id_destino == id_destino).one()
    except NoResultFound:
        return None

def getHijos(id_item):
    """
        Obtiene todos las relaciones hijas (que esten activas) del item dado
        @return: Listado de las relaciones hijas del item
        @rtype: List(Relacion)
        """
    hijos = []
    relacion = Relaciones.query.filter(Relaciones.id_origen == id_item).all()
    
    for rel in relacion:
        if(rel.tipo == 1 and rel.activo == True):
            hijos.append(rel.id_destino)
    return hijos
        


def tieneCiclo(hijos, id_origen):
    """
        Comprueba si una relacion forma un ciclo en una fase
        @param hijos: lista de hijos de un item
        @param item_origen: el item que es origen de la relacion que se quiere comprobar si forma una relacion
    """
    if not hijos:
        return False
    for hi in hijos:
        if hi == id_origen:
            return True
        if not tieneCiclo(getHijos(hi), id_origen):
            return False

        


def recorrerAtras(idItem, visitadoAtras):
  
    item = Items.query.filter(Items.id_item == idItem).one()
    origenes = Relaciones.query.filter(Relaciones.id_destino == item.id_item).all()
    if origenes != None:
        for origen in origenes:
            items = Items.query.filter(Items.id_item == origen.id_origen).one()
            if yaFueVisitado(items.id_item, visitadoAtras) == False:
                visitadoAtras.append(items.id_item)
                recorrerAtras(items.id_item, visitadoAtras)
        return 
    else:
        return 
        
def recorrerAdelante(idItem, visitadoAdelante): 
    
    item = Items.query.filter(Items.id_item == idItem)
    destinos = Relaciones.query.filter(Relaciones.id_origen == idItem).all()
    if destinos != None:
        for destino in destinos:
            items = Items.query.filter(Items.id_item == destino.id_destino).one()  
            if yaFueVisitado(items.id_item, visitadoAdelante) == False:
                visitadoAdelante.append(items.id_item)
                recorrerAdelante(items.id_item, visitadoAdelante)
        return 
    else:
        return
    
    
def yaFueVisitado(id_item, visitado):   
    i = 0
    for v in visitado:
        if visitado[i] == id_item:
            return True
        else:
            i = i + 1
    return False
     